package com.itheima.demo1create;

import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;

public class ThreadDemo4 {
    public static void main(String[] args)
    {
//        目标：多线程的创建方式3：实现Callable接口，方式三的优势：可以获取线程执行结果。
//        3、创建一个Callable接口的实现类对象。
        Callable<String> c1=new MyCallable(100);
//        4、把Callable接口的实现类对象封装成一个真正的线程任务对象FutureTask对象。
        /*
        未来任务对象的作用？
        本身就是一个Runnable线程任务对象，可以交给Thread线程对象处理。
        同时，还可以获取线程任务的执行结果。
         */
        FutureTask<String> f1=new FutureTask<>(c1);
//        把FutureTask对象作为Thread线程任务对象
        Thread t1=new Thread(f1);
//        启动线程
        t1.start();
//        第二个线程启动
        Callable<String> c2=new MyCallable(50);
        FutureTask<String> f2=new FutureTask<>(c2);
        Thread t2=new Thread(f2);
        t2.start();

        try {
//            如果主线程发现第一个线程还没执行完毕，会让出cpu,等第一个线程执行结束，主线程再继续执行。
            System.out.println(f1.get());
        } catch (Exception e) {
            e.printStackTrace();
        }

        try {
//            如果主线程发现第一个线程还没执行完毕，会让出cpu,等第一个线程执行结束，主线程再继续执行。
            System.out.println(f2.get());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
//1、定义一个类 实现Callable接口
class MyCallable implements Callable<String> {
    private int num;
    public MyCallable(int num)
    {
        this.num = num;
    }
    @Override
    //2、重写call方法，有返回值，可以获取线程执行结果
    public String call() throws Exception
    {
        int sum = 0;
        for (int i = 1; i <= num; i++)
        {
            sum += i;
        }
        return "子线程计算1-"+num+"结果是"+sum;
    }
}
